package com.lizicloud.infrastructure.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 数学计算工具类
 */
public class MathUtils {
    
    /**
     * 默认精度
     */
    private static final int DEFAULT_SCALE = 2;
    
    /**
     * 加法运算
     */
    public static double add(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }
    
    /**
     * 减法运算
     */
    public static double subtract(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }
    
    /**
     * 乘法运算
     */
    public static double multiply(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).doubleValue();
    }
    
    /**
     * 除法运算
     */
    public static double divide(double v1, double v2) {
        return divide(v1, v2, DEFAULT_SCALE);
    }
    
    /**
     * 除法运算（指定精度）
     */
    public static double divide(double v1, double v2, int scale) {
        if (v2 == 0) {
            throw new IllegalArgumentException("除数不能为0");
        }
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
    }
    
    /**
     * 四舍五入
     */
    public static double round(double value) {
        return round(value, DEFAULT_SCALE);
    }
    
    /**
     * 四舍五入（指定精度）
     */
    public static double round(double value, int scale) {
        BigDecimal b = BigDecimal.valueOf(value);
        return b.setScale(scale, RoundingMode.HALF_UP).doubleValue();
    }
    
    /**
     * 获取百分比
     */
    public static String getPercentage(double numerator, double denominator) {
        if (denominator == 0) {
            return "0.00%";
        }
        double percentage = (numerator / denominator) * 100;
        return String.format("%.2f%%", round(percentage));
    }
    
    /**
     * 检查是否为正数
     */
    public static boolean isPositive(double value) {
        return value > 0;
    }
    
    /**
     * 检查是否为负数
     */
    public static boolean isNegative(double value) {
        return value < 0;
    }
    
    /**
     * 检查是否为零
     */
    public static boolean isZero(double value) {
        return Math.abs(value) < 0.000001;
    }
    
    /**
     * 比较两个double值是否相等
     */
    public static boolean equals(double v1, double v2) {
        return Math.abs(v1 - v2) < 0.000001;
    }
    
    /**
     * 获取最大值
     */
    public static double max(double... values) {
        if (values == null || values.length == 0) {
            throw new IllegalArgumentException("参数不能为空");
        }
        double max = values[0];
        for (int i = 1; i < values.length; i++) {
            if (values[i] > max) {
                max = values[i];
            }
        }
        return max;
    }
    
    /**
     * 获取最小值
     */
    public static double min(double... values) {
        if (values == null || values.length == 0) {
            throw new IllegalArgumentException("参数不能为空");
        }
        double min = values[0];
        for (int i = 1; i < values.length; i++) {
            if (values[i] < min) {
                min = values[i];
            }
        }
        return min;
    }
    
    private MathUtils() {
        // 私有构造函数，防止实例化
    }
}